#pragma once
#include "Connection.hpp"
#include "Log.hpp"
#include <string>
#include <functional>



class HandlerConnection
{
public:
    HandlerConnection(func_t func)
        :_func(func)
    {}

    void HandlerRecv(Connection* conn)
    {
        errno = 0;
        Log(DEBUG, "HanlderRecv fd : %d\n", conn->Sockfd());
        while(1)//一直读取，直到出错
        {
            char buffer[1024];
            ssize_t n = read(conn->Sockfd(),buffer,sizeof(buffer));
            std::cout<<n<<std::endl;
            if(n>0)
            {
                buffer[n] = 0;
                conn->AppendInBuffer(buffer);
            }
            else 
            {
                if(errno == EWOULDBLOCK || errno == EAGAIN)//资源没有就绪
                {
                    break;
                }
                else if(errno==EINTR)//被信号中断，需要继续读取
                {
                    continue;
                }
                else//异常了 
                {
                    //走异常的函数
                    conn->_excepter(conn);
                    break;
                }
            }
        }
        

        //处理业务
        _func(conn);
    }

    void HandlerSend(Connection *conn)
    {
        errno = 0;
        Log(DEBUG, "HanlderSend fd : %d\n", conn->Sockfd());
        while(1)
        {
            ssize_t n = write(conn->Sockfd(),conn->Outbuffer().c_str(),conn->Outbuffer().size());
            
            if(n>0)
            {
                //发送之后需要把发送的数据删除了
                conn->OutbufferRemove(n);
                if(conn->OutbufferEmpty())//缓冲区数据发完了，可以退出了
                    break;
            }
            else if(n==0)
            {
                break;//虽然不可能，为了代码健壮性还是加上
            }
            else
            {
                if(errno == EWOULDBLOCK || errno == EAGAIN)//资源没有就绪
                {
                    break;
                }
                else if(errno==EINTR)//被信号中断，需要继续读取
                {
                    continue;
                }
                else//异常了 
                {
                    //走异常的函数
                    conn->_excepter(conn);
                    break;
                }
            }
        }
        //查看一下是不是Tcp的发送缓冲区被写满了
        if(!conn->OutbufferEmpty())
        {
            conn->_R->EnableReadWrite(conn->Sockfd(),true,true);//托管给系统
        }
        else   
        {
            conn->_R->EnableReadWrite(conn->Sockfd(),true,false);
        }
    }


    void HandlerExcpet(Connection *conn)
    {
        errno = 0;
        Log(DEBUG, "client quit : %d\n",conn->Sockfd());
        conn->_R->RemoveConnection(conn->Sockfd());//删除conn
    }

private:
    func_t _func;

};